﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using JudoTec.cls;
using MySql.Data.MySqlClient;

namespace JudoTec.forms
{
    public partial class Liga : UserControl
    {
        // Variables de la BD
        MySqlDataAdapter adaptador;
        DataTable tablaCombates;
        DataTable tablaParticipantes;
        System.Data.DataSet datos;
        MySqlCommand comando;

        int idCompeticion;
        // Numero de liga 1 o 2
        int numLiga;
        int numReg;
        int numeroTotalParticipantes;
        int[] Lista_Puntucaiones;
        TableLayoutPanel tabla;

        public Liga(int id_competicion, int numLiga)
        {
            InitializeComponent();
            this.idCompeticion = id_competicion;
            this.numLiga = numLiga;
            obtenerTablaCombates();
            obtenerTablaParticipantes();
            this.numReg = tablaCombates.Rows.Count;
            this.groupBox1.Text = "Liga Número " + numLiga;
            generarTabla();
            
        }

        //MEtodoq ue me obtiene todos los combates para una competicion y liga dadas
        private void obtenerTablaCombates()
        {
            MySqlConnection conexion = cls.ConexionMySQL.IniciarConexion();
            // Consulta SQL en cadena string
            string consulta = "SELECT * FROM combates WHERE Ronda = 1 AND Id_Competicion = " + this.idCompeticion + " AND Liga = " + this.numLiga;
            comando = new MySqlCommand(consulta, conexion);
            datos = new DataSet();
            adaptador = new MySqlDataAdapter();
            adaptador.SelectCommand = comando;
            adaptador.Fill(datos, "misCombates");
            tablaCombates = datos.Tables["misCombates"];
            conexion.Close();
        }

        //Metodo que me obtiene la tabla de todos los participantes
        private void obtenerTablaParticipantes()
        {
            MySqlConnection conexion = cls.ConexionMySQL.IniciarConexion();
            // Consulta SQL en cadena string
            string consulta = "SELECT * FROM participantes";
            comando = new MySqlCommand(consulta, conexion);
            datos = new DataSet();
            adaptador = new MySqlDataAdapter();
            adaptador.SelectCommand = comando;
            adaptador.Fill(datos, "misParticipantes");
            tablaParticipantes = datos.Tables["misParticipantes"];
            conexion.Close();
        }

        //Metodo encargado de recorreme la tabla y guardar todos los datos de los combates, en particular las puntuaciones
        public void guardarTabla() 
        {
            Combate miCombate;
            TextBox miTexbox = new TextBox();
            string nombre;
            int aux = 0;
            //Vaciamos el vector de puntuaciones 
            foreach (int entero in Lista_Puntucaiones)
            {
                Lista_Puntucaiones[aux] = 0;
                aux++;
            }

            foreach (DataRow filaCombate in tablaCombates.Rows)
            {
                miCombate = new Combate();
                miCombate.Id_Combate = Convert.ToInt32(filaCombate["Id_Combate"]);
                miCombate.Id_Competicion = Convert.ToInt32(filaCombate["Id_Competicion"]);
                miCombate.Liga = Convert.ToInt32(filaCombate["Liga"]);
                miCombate.Ronda = Convert.ToInt32(filaCombate["Ronda"]);
                miCombate.Participante_Primero = Convert.ToInt32(filaCombate["Participante_Primero"]);
                miCombate.Participante_Segundo = Convert.ToInt32(filaCombate["Participante_Segundo"]);
                miCombate.Dni_1 = Convert.ToString(filaCombate["DNI_1"]);;
                miCombate.Dni_2 = Convert.ToString(filaCombate["DNI_2"]); ;
                // Accedo mediante el name de los texbox a su contenido siendo el idCOmpeticion mas 1 para la puntuacion 1
                // y idCombate +2 para la puntuacion 2
                nombre = Convert.ToString(filaCombate["Id_Combate"]) + 1;
                miCombate.Puntuacion_1 = Convert.ToInt32(((TextBox)this.Controls.Find(nombre, true)[0]).Text);
                nombre = Convert.ToString(filaCombate["Id_Combate"]) + 2;
                miCombate.Puntuacion_2 = Convert.ToInt32(((TextBox)this.Controls.Find(nombre, true)[0]).Text);
                miCombate.Activo = Convert.ToBoolean(filaCombate["Activo"]);
                miCombate.ModificarCombate();

                //Actualizamos el el vector listado de puntuaciones
                Lista_Puntucaiones[Convert.ToInt32(filaCombate["Participante_Primero"]) - 1] = Lista_Puntucaiones[Convert.ToInt32(filaCombate["Participante_Primero"]) - 1] + miCombate.Puntuacion_1;
                Lista_Puntucaiones[Convert.ToInt32(filaCombate["Participante_Segundo"]) - 1] = Lista_Puntucaiones[Convert.ToInt32(filaCombate["Participante_Segundo"]) - 1] + miCombate.Puntuacion_2;
            }

            // Actualizamos los texbox
            for (int i = 0; i < numeroTotalParticipantes; i++)
                ((TextBox)this.Controls.Find("tb_Ptos" + (i + 1), true)[0]).Text = Convert.ToString(Lista_Puntucaiones[i]);
        }

        //Metodo encargado de rellenar la tabla de combates a partir de las bases de datos de combates y participantes
        private void generarTabla()
        {
           DataRow ultimaFilaCombate = tablaCombates.Rows[numReg-1];
           numeroTotalParticipantes = Convert.ToInt32(ultimaFilaCombate["Participante_Segundo"]);
           this.Lista_Puntucaiones = new int[numeroTotalParticipantes];
           //Definimos la tabla
           tabla = new TableLayoutPanel();
           tabla.ColumnCount = numeroTotalParticipantes + 5;
           tabla.RowCount = numeroTotalParticipantes + 1;
           tabla.AutoScroll = true;
           tabla.AutoSize = true;

           //Cargamos la tabla
           this.panel1.Controls.Add(tabla);
           

           //POnemos todas las etiquetas en la cabecera de la tabla
           Label label_Nombre = new Label();
           label_Nombre.Name = "Nombre";
           label_Nombre.Text = "NOMBRE Y APELLIDOS";
           label_Nombre.AutoSize = true;
           tabla.Controls.Add(label_Nombre, 1, 0);

           Label label_Club = new Label();
           label_Club.Name = "Club";
           label_Club.Text = "CLUB";
           label_Club.AutoSize = true;
           tabla.Controls.Add(label_Club, 2, 0);

           for (int col = 3; col < numeroTotalParticipantes + 3; col++)
           {
               Label label_Num_Part = new Label();
               label_Num_Part.Name = "Numero_Part" + (col - 3);
               label_Num_Part.Text = "" + (col - 2);
               label_Num_Part.Width = 30;
               tabla.Controls.Add(label_Num_Part, col, 0);
           }

           Label label_Puntuacion = new Label();
           label_Puntuacion.Name = "Puntuacion";
           label_Puntuacion.Text = "PUNTUACIÓN";
           label_Puntuacion.Width = 80;
           tabla.Controls.Add(label_Puntuacion, numeroTotalParticipantes + 3, 0);

           int numPart = 0;
           int nuevoNumPart = 0;
           int contReg = 1;
           Label label_DNI;
           
           /*
            * FUNCIONAMIENTO DEL METODO ADD EN UNA TABLA....
            * tabla.Controls.Add(Objeto, Num_Columna, Num_Fila);
            * */
           foreach (DataRow filaCombate in tablaCombates.Rows)
           {
               nuevoNumPart= Convert.ToInt32(filaCombate["Participante_Primero"]);
               // Esto se rellena para cada nuevo combatiente
               if(numPart != nuevoNumPart){
                  // DataRow[] filaParticipante = tablaParticipantes.Select("DNI_Participante = " + Convert.ToString(filaCombate["DNI_1"]));
                   DataRow[] filaParticipante = tablaParticipantes.Select("DNI_Participante = '"+Convert.ToString(filaCombate["DNI_1"])+"'");
                   // PONEMOS EL NUMERO
                   Label label_Num_Part = new Label();
                   label_Num_Part.Name = "Numero_Part" + nuevoNumPart;
                   label_Num_Part.Text = Convert.ToString(filaCombate["Participante_Primero"]);
                   label_Num_Part.Width = 30;
                   tabla.Controls.Add(label_Num_Part, 0, nuevoNumPart);

                   //PONEMOS EL NOMBRE
                   label_Nombre = new Label();
                   label_Nombre.Name = "lb_Nombre" + nuevoNumPart;
                   label_Nombre.AutoSize = true;
                   label_Nombre.Text = Convert.ToString(filaParticipante[0][1]) + " " + Convert.ToString(filaParticipante[0][2]);
                   tabla.Controls.Add(label_Nombre, 1, nuevoNumPart);
                   
                   //PONEMOS EL CLUB
                   label_Club = new Label();
                   label_Club.Name = "lb_Club" + nuevoNumPart;
                   label_Club.AutoSize = true;
                   label_Club.Text = Convert.ToString(filaParticipante[0][6]);
                   label_Club.AutoSize = true;
                   tabla.Controls.Add(label_Club, 2, nuevoNumPart);
                  
                  //PONEMOS EL DNI PERO LO DEJAREMOS OCULTO!!!!
                   label_DNI = new Label();
                   label_DNI.Name = "lb_DNI" + nuevoNumPart;
                   label_DNI.Text = Convert.ToString(filaParticipante[0][0]);
                   label_DNI.Visible = false;
                   tabla.Controls.Add(label_DNI, numeroTotalParticipantes + 4, nuevoNumPart);

                   numPart++;

                   if (contReg == numReg)
                   {
                       filaParticipante = tablaParticipantes.Select("DNI_Participante = '" + Convert.ToString(filaCombate["DNI_2"]) + "'");
                       nuevoNumPart = Convert.ToInt32(filaCombate["Participante_Segundo"]);
                       // PONEMOS EL NUMERO
                       label_Num_Part = new Label();
                       label_Num_Part.Name = "Numero_Part" + nuevoNumPart;
                       label_Num_Part.Text = Convert.ToString(filaCombate["Participante_Segundo"]);
                       label_Num_Part.Width = 30;
                       tabla.Controls.Add(label_Num_Part, 0, nuevoNumPart);

                       //PONEMOS EL NOMBRE
                       label_Nombre = new Label();
                       label_Nombre.Name = "lb_Nombre" + nuevoNumPart;
                       label_Nombre.AutoSize = true;
                       label_Nombre.Text = Convert.ToString(filaParticipante[0][1]) + " " + Convert.ToString(filaParticipante[0][2]);
                       tabla.Controls.Add(label_Nombre, 1, nuevoNumPart);

                       //PONEMOS EL CLUB
                       label_Club = new Label();
                       label_Club.Name = "lb_Club" + nuevoNumPart;
                       label_Club.Text = Convert.ToString(filaParticipante[0][6]);
                       label_Club.AutoSize = true;
                       tabla.Controls.Add(label_Club, 2, nuevoNumPart);

                       //PONEMOS EL DNI PERO LO DEJAREMOS OCULTO!!!!
                       label_DNI = new Label();
                       label_DNI.Name = "lb_DNI" + nuevoNumPart;
                       label_DNI.Text = Convert.ToString(filaParticipante[0][0]);
                       label_DNI.Visible = false;
                       tabla.Controls.Add(label_DNI, numeroTotalParticipantes + 4, nuevoNumPart);
                   }
               }
               // Con esto inscribimos las dos puntuaciones del comabte en syus respectivos lugares (SIMETRICOS)
               TextBox combate1 = new TextBox();
               combate1.Name = Convert.ToString(filaCombate["Id_Combate"])+1;
               combate1.Text = Convert.ToString(filaCombate["Puntuacion_1"]);
               combate1.Width = 30;
               combate1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(validarTexBoxNumerico);
               tabla.Controls.Add(combate1, Convert.ToInt32(filaCombate["Participante_Segundo"]) +2, Convert.ToInt32(filaCombate["Participante_Primero"]));
               
               TextBox combate2 = new TextBox();
               combate2.Name = Convert.ToString(filaCombate["Id_Combate"])+2;
               combate2.Text = Convert.ToString(filaCombate["Puntuacion_2"]);
               combate2.Width = 30;
               combate2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(validarTexBoxNumerico);
               tabla.Controls.Add(combate2, Convert.ToInt32(filaCombate["Participante_Primero"]) + 2, Convert.ToInt32(filaCombate["Participante_Segundo"]));

               //Sumamos las puntuaciones de los comabatienes a su total
               Lista_Puntucaiones[Convert.ToInt32(filaCombate["Participante_Primero"]) - 1] = Lista_Puntucaiones[Convert.ToInt32(filaCombate["Participante_Primero"]) - 1] + Convert.ToInt32(filaCombate["Puntuacion_1"]);
               Lista_Puntucaiones[Convert.ToInt32(filaCombate["Participante_Segundo"]) - 1] = Lista_Puntucaiones[Convert.ToInt32(filaCombate["Participante_Segundo"]) - 1] + Convert.ToInt32(filaCombate["Puntuacion_2"]);
               // Aumentamos el contador de registros
               contReg++;         
           }

           TextBox miPuntuacion;
           for (int i = 0; i < numeroTotalParticipantes; i++)
           {
               miPuntuacion = new TextBox();
               miPuntuacion.Name = "tb_Ptos" + (i+1);
               miPuntuacion.Text = Convert.ToString(Lista_Puntucaiones[i]);
               miPuntuacion.Width = 75 ;
               //miPuntuacion.Enabled = false;
               miPuntuacion.BackColor= Color.White;
               miPuntuacion.ReadOnly = true;
               miPuntuacion.TextAlign = HorizontalAlignment.Center;
               tabla.Controls.Add(miPuntuacion, numeroTotalParticipantes + 3, i + 1);
           }

           //Ahora hacemos la diagonal negra......
           for (int col = 3; col < numeroTotalParticipantes + 3; col++)
           {
               for (int fila = 1; fila < numeroTotalParticipantes + 1; fila++)
               {
                   if (fila + 2 == col)
                   {
                       TextBox miTextBox = new TextBox();
                       miTextBox.Name = (col - 3) + "-" + (fila - 1);
                       miTextBox.BackColor = Color.Black;
                       miTextBox.Enabled = false;
                       miTextBox.Width = 30;
                       tabla.Controls.Add(miTextBox, col, fila);
                   }
               }
           }    
        }

        //Metodo que aplicado al evento de un texbox me dice me lo bloquea si semete cualquier cosa que no se aun numero
        private void validarTexBoxNumerico(object sender,KeyPressEventArgs e)
        {
            //Para obligar a que sólo se introduzcan números 
            if (Char.IsDigit(e.KeyChar))
            {
                e.Handled = false;
            }
            else
                if (Char.IsControl(e.KeyChar)) //permitir teclas de control como retroceso 
                {
                    e.Handled = false;
                }
                else
                {
                    //el resto de teclas pulsadas se desactivan 
                    e.Handled = true;
                }
        } 

        public TableLayoutPanel Tabla
        {
            get { return tabla; }
            set { tabla = value; }
        }

        private void lb_liga_Click(object sender, EventArgs e)
        {

        }

        private void groupBox1_Enter(object sender, EventArgs e)
        {

        }
    }
}
